package model

import (
	"errors"

	"gorm.io/gorm"
)

type Department struct {
	BaseModal
	Name    string `gorm:"type:varchar(100);column:name" json:"name"`
	Code    int64  `gorm:"type:varchar(255);column:code" json:"code"`
	Company int64  `gorm:"type:bigint;column:company" json:"company"`
	Parent  int64  `gorm:"type:bigint;column:parent" json:"parent"`
	Leader  int64  `gorm:"type:bigint;column:leader" json:"leader"`
}

func (d *Department) TableName() string {
	return "sys_dept"
}

// BeforeCreate 在创建前检查公司和上级部门是否存在
func (d *Department) BeforeCreate(tx *gorm.DB) error {
	// 检查公司是否存在
	if d.Company != 0 {
		var company Company
		if err := tx.Model(&Company{}).Where("id = ?", d.Company).First(&company).Error; err != nil {
			if errors.Is(err, gorm.ErrRecordNotFound) {
				return errors.New("指定的公司不存在")
			}
			return err
		}
	}

	// 检查上级部门是否存在
	if d.Parent != 0 {
		var parentDept Department
		if err := tx.Model(&Department{}).Where("id = ?", d.Parent).First(&parentDept).Error; err != nil {
			if errors.Is(err, gorm.ErrRecordNotFound) {
				return errors.New("指定的上级部门不存在")
			}
			return err
		}
	}

	return nil
}

// BeforeUpdate 在更新前检查公司和上级部门是否存在
func (d *Department) BeforeUpdate(tx *gorm.DB) error {
	// 检查公司是否存在
	if d.Company != 0 {
		var company Company
		if err := tx.Model(&Company{}).Where("id = ?", d.Company).First(&company).Error; err != nil {
			if errors.Is(err, gorm.ErrRecordNotFound) {
				return errors.New("指定的公司不存在")
			}
			return err
		}
	}

	// 检查上级部门是否存在
	if d.Parent != 0 {
		var parentDept Department
		if err := tx.Model(&Department{}).Where("id = ?", d.Parent).First(&parentDept).Error; err != nil {
			if errors.Is(err, gorm.ErrRecordNotFound) {
				return errors.New("指定的上级部门不存在")
			}
			return err
		}
	}

	return nil
}

// BeforeDelete 在删除前检查是否有下级部门
func (d *Department) BeforeDelete(tx *gorm.DB) error {
	var count int64
	if err := tx.Model(&Department{}).Where("parent = ?", d.ID).Count(&count).Error; err != nil {
		return err
	}

	if count > 0 {
		return errors.New("该部门存在下级部门，无法删除")
	}

	return nil
}
